package com.bluesky.plum.util;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;

public class HibernateUtil {
	private static final SessionFactory sessionFactory = buildSessionFactory();

	private static SessionFactory buildSessionFactory() {
		try {
			// Create the SessionFactory from hibernate.cfg.xml
			return new Configuration().configure("config/hibernate/hibernate.cfg.xml").buildSessionFactory();
		} catch (Throwable ex) {
			// Make sure you log the exception, as it might be swallowed
			System.err.println("Initial SessionFactory creation failed." + ex);
			throw new ExceptionInInitializerError(ex);
		}
	}

	public static SessionFactory getSessionFactory() {
		return sessionFactory;
	}

	public static Session getCurrentSession() {
		return sessionFactory.getCurrentSession();
	}

	public static void doCallback(HibernateCallBack callback) {
		Session session = getCurrentSession();
		Transaction trans = session.getTransaction();

		// begin transaction if has not
		if (!trans.isActive())
			trans = session.beginTransaction();
		
		try {
			callback.callback(session);

			trans.commit();
		} catch (Exception e) {
			trans.rollback();
		}

	}
}
